package com.ctl.jvm;

/**
 * <p>Title: ByteBufPoolExample</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2019</p>
 * <p>Company: www.ctl.com</p>
 * 堆外内存
 * @author ctl
 * @version 1.1
 * @date 2023-11-13 10:17
 */
import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;

public class ByteBufPoolExample {
    /**
     * {@link  DirectByteBufferExample}
     * @param args
     */
    public static void main(String[] args) {
        PooledByteBufAllocator allocator = new PooledByteBufAllocator();

        // Create a ByteBuf of 1024 bytes from the pool
        ByteBuf buf = allocator.buffer(1024);

        // Write data to the buffer
        buf.writeBytes("Hello, world!".getBytes());

        // Read data from the buffer
        byte[] data = new byte[buf.readableBytes()];
        buf.getBytes(buf.readerIndex(), data);

        // Print the data
        System.out.println(new String(data));

        // Release the buffer back to the pool
        buf.release();
    }
}
/**
 * 在此示例中，我们首先创建了一个 PooledByteBufAllocator 对象，这个对象将会管理我们的ByteBuf对象。
 * 接着，我们通过调用 allocator.buffer(1024) 方法从对象池中获取一个大小为1024字节的ByteBuf对象，
 * 并将数据写入该缓冲区。在读取数据之后，我们释放缓冲区以将其返回到对象池中以便重用。
 * 值得注意的是，如果您需要长时间持有ByteBuf对象，则不应该将它们释放回对象池中。在这种情况下，您应该手动引用计数并在使用完毕后显式地释放它们。
 */
